package com.ls.fw.data.dao;

import java.sql.SQLException;
import java.util.List;

import com.ls.fw.data.bean.Record;
import com.ls.fw.data.bean.Table;
import com.ls.fw.data.handler.SqlParser;
import com.ls.fw.data.mapper.RowMapper;
import com.ls.fw.data.mapper.ScanRowMapper;
import com.ls.fw.data.result.DataResult;
import com.ls.fw.data.result.DataResultSet;
import com.ls.fw.data.statement.Delete;
import com.ls.fw.data.statement.Insert;
import com.ls.fw.data.statement.Select;
import com.ls.fw.data.statement.Update;


/**
 * 数据访问接口（不对外提供）
 * @author ls
 * 2014年12月13日下午3:39:33
 */
public interface Dao  {

	/**
	 * 添加(需要判断是否存在)
	 * @author ls
	 * 2014年11月21日下午3:24:33 
	 * @param insert
	 * @return
	 */
	public boolean insert(Insert insert);
	
	
	/**
	 * 添加
	 * @author ls
	 * 2014年11月21日下午6:02:52 
	 * @param insert
	 * @param checkExist 是否检查存在性
	 * @return
	 */
	public boolean insert(Insert insert, boolean checkExist);
	
	
	/**
	 * 删除
	 * @author ls
	 * 2014年11月21日下午3:24:36 
	 * @param delete
	 * @return
	 */
	public boolean delete(Delete delete);
	
	
	/**
	 * 修改
	 * @author ls
	 * 2014年11月21日下午3:24:43 
	 * @param update
	 * @return
	 */
	public boolean update(Update update);
	
	
	/**
	 * 修改
	 * @author ls
	 * 2014年11月25日下午3:58:10 
	 * @param update
	 * @param checkExist
	 * @return
	 */
	public boolean update(Update update, boolean checkExist);
	
	
	/**
	 * 查询
	 * @author ls
	 * 2014年11月21日下午3:25:52 
	 * @param select
	 * @return
	 */
	public DataResult search(Select select);
	
	public  <T> List<T>  search(Select select, RowMapper<T> rowMapper);
	
	/**
	 * 是否存在
	 * @author ls
	 * 2014年12月1日下午12:47:32 
	 * @param select
	 * @return
	 */
	public boolean exist(Select select);
	
	
	/**
	 * 查询
	 * @author ls
	 * 2014年11月25日上午11:13:45 
	 * @param select
	 * @return
	 */
	public DataResultSet executeQuery(Select select);
	
	/**
	 * 统计数量
	 * @author ls
	 * 2014年11月21日下午6:01:50 
	 * @param sql
	 * @return
	 * @throws SQLException 
	 */
	public long executeQueryForInt(final Select select) throws SQLException;
	
	
	/**
	 * 执行更新操作(添加、删除、修改)
	 * @author ls
	 * 2014年11月21日下午6:01:41 
	 * @param sql
	 * @return 
	 */
	public void execute(final String sql);
	
	
	/**
	 * 执行更新操作(添加、删除、修改)
	 * @author ls
	 * 2014年11月21日下午6:03:25 
	 * @param sql
	 * @param checkExist 是否检查存在性
	 * @return 
	 */
	public void execute(final String sql, boolean checkExist);
	
	
	/**
	 * 统计数量
	 * @author ls
	 * 2014年11月21日下午6:01:50 
	 * @param sql
	 * @return
	 * @throws SQLException 
	 */
	public long executeQueryForInt(final String sql) throws SQLException;
	
	
	/**
	 * 查询
	 * @author ls
	 * 2014年11月21日下午6:02:08 
	 * @param sql
	 * @return
	 */
	public List<?> executeQuery(final String sql);
	

	/**
	 * 遍历数据
	 * @author ls
	 * 2014年11月25日下午6:01:06 
	 * @param select
	 * @param rowMapper
	 * @return
	 * @throws SQLException
	 */
	public <T> long scan(Select select, ScanRowMapper<T> rowMapper) throws SQLException;
	

	/**
	 * 导入数据
	 * @author ls
	 * 2014年12月5日上午10:54:47 
	 * @param fromTable
	 * @param select
	 * @param toTable
	 * @param deleteOldData
	 * @param rowMapper
	 * @throws SQLException
	 */
	public long load(Table fromTable, Select select, Table toTable, boolean deleteOldData, ScanRowMapper<Record> rowMapper) throws SQLException;
	
	
	/**
	 * 添加表结构
	 * @author ls
	 * 2014年12月3日下午5:04:38 
	 * @param table
	 * @return
	 */
	public boolean create(Table table);
	
	
	/**
	 * 修改表结构
	 * @author ls
	 * 2014年12月3日下午5:04:47 
	 * @param table
	 * @return
	 */
	public boolean update(Table table);
	
	
	/**
	 * 删除表结构
	 * @author ls
	 * 2014年12月3日下午5:04:56 
	 * @param table
	 * @return
	 */
	public boolean drop(Table table);
	

	/**
	 * 
	 * @author lisheng
	 * @date 2015年3月16日 下午9:05:03
	 * @version V1.0
	 * @param name
	 * @return
	 */
	Table getTable(String name);
	
	public SqlParser getSqlParser();
}
